package com.catazzz.springbootstudy.common.task;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

/**
 * @作者: Tao
 * @日期: 2025/1/8
 * @时间: 14:50
 * @描述: 延时任务 <br><pre>
 */
@Slf4j
@Component
public class TimeTask {
    // 定义一个数组，模拟不同人的如厕耗时
    private int[] people = {6, 2, 3, 1};
    // 计数器，用于记录当前是第几个人如厕
    private int count = 0;

    /**
     * 定义一个固定延迟调度的任务
     * 该方法将在上一个任务完成后再等待5秒执行
     * @throws InterruptedException 如果在睡眠期间线程被中断
     */
//    @Scheduled(fixedDelay = 5000)
    public void fixedDelayTask() throws InterruptedException {
        if (count < 4) {
            int timeConsuming = people[count];
            log.info("fixedDelayTask----第{}个人在{}开始如厕，耗时{}秒", count + 1, formatTime(), timeConsuming);
            Thread.sleep(timeConsuming * 1000L);
            count++;
        }
    }

    /**
     * 定义一个基于Cron表达式的调度任务
     * 该方法每5秒执行一次，不受上一个任务完成时间的影响
     * @throws InterruptedException 如果在睡眠期间线程被中断
     */
//    @Scheduled(cron = "*/5 * * * * ?")
    public void cronTask() throws InterruptedException {
        if (count < 4) {
            int timeConsuming = people[count];
            log.info("cronTask----第{}个人在{}开始如厕，耗时{}秒", count + 1, formatTime(), timeConsuming);
            Thread.sleep(timeConsuming * 1000L);
            count++;
        }
    }

    /**
     * 定义一个固定速率调度的任务
     * 该方法将在上一个任务开始后5秒再次开始，无论上一个任务是否完成
     * @throws InterruptedException 如果在睡眠期间线程被中断
     */
//    @Scheduled(fixedRate = 5000)
    public void fixedRateTask() throws InterruptedException {
        if (count < 4) {
            int timeConsuming = people[count];
            log.info("fixedRateTask----第{}个人在{}开始如厕，耗时{}秒", count + 1, formatTime(), timeConsuming);
            Thread.sleep(timeConsuming * 1000L);
            count++;
        }
    }

    /**
     * 格式化当前时间
     * @return 当前时间的字符串表示，格式为HH:mm:ss
     */
    private String formatTime() {
        return LocalTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss"));
    }
}

